<?php

include_once("../dao/ocorrencia_dao_class.php");
include_once("../model/ocorrencia_model_class.php");
include_once("../utilitarios/fotos_class.php");
include_once("../controller/tipo_ocorrencia_controller_class.php");
include_once("../controller/equipe_controller_class.php");

class OcorrenciaController {

    function cadastrar($especialidade, $tipoOcorrencia, $campus, $comentario = "", $foto = "", $predio = "", $sala = "", $funcionario = "") {
        $ocoM = new OcorrenciaModel();

        $ocoM->setEspecialidade($especialidade);
        $ocoM->setTipoOcorrencia($tipoOcorrencia);
        $ocoM->setDataHora(date('Y-m-d H:i:s'));
        if (empty($foto)) {
            $foto = NULL;
        }
        $ocoM->setFoto($foto);
        if (empty($comentario)) {
            $comentario = NULL;
        }
        $ocoM->setComentario($comentario);
        $ocoM->setCampus($campus);

        $ocoM->setCampus($campus);
        if (empty($predio)) {
            $predio = NULL;
        }
        $ocoM->setPredio($predio);
        if (empty($sala)) {
            $sala = NULL;
        }
        $ocoM->setSala($sala);

        $ocoM->setAndamento(1);

        if (empty($funcionario)) {
            $funcionario = NULL;
        }
        $ocoM->setFuncionario($funcionario);

        //pega id do tipo da ocorrencia para salvar na ocorrencia
        $objTipOco = new TipoOcorrenciaController();
        $ocorrencia = $objTipOco->selecionarPorId($tipoOcorrencia);
        $ocoM->setUrgencia($ocorrencia->getUrgencia()->getId());

        $oco = new OcorrenciaDao();
//        echo "<pre>";
//        var_dump($ocoM);
        return $oco->insert($ocoM);
    }

    function alterarUrgencia($id, $urgencia) {
        $oco = new OcorrenciaDao();

        return $oco->updateUrgencia($id,$urgencia);
    }

    function excluir($id) {
        $oco = new OcorrenciaDao();

        return $oco->update($id);
    }

    function selecionar() {
        $oco = new OcorrenciaDao();

        return $oco->findAllOcorrencias();
    }
    
    function selecionarPorId($id) {
        $oco = new OcorrenciaDao();

        return $oco->findById($id);
    }

    function salvarFoto($arquivo, $local) {
        $img = new Fotos();

        return $img->upload($arquivo, $local);
    }

    /**
     * 
     * @param type $urgencia MUITA = 1, MEDIA = 2, POUCA = 3
     * @param type $andamento EM ABERTO = 1, AGUARDANDO APROVAÇÃO = 2 AGUARDANDO EQUIPE = 3, 
     * AGUARDANDO INICIO = 4, EM ANDAMENTO = 5, FINALIZADOS = 6
     * @return type
     */
    function listarOcorrencias($urgencia, $andamento, $campus = "") {
        $oco = new OcorrenciaDao();
        if (!empty($campus)) {
            return $oco->findByUrgenciaAndamentoCampus($urgencia, $andamento, $campus);
        } else {
            return $oco->findByUrgenciaAndamento($urgencia, $andamento);
        }
    }
    
    function listarContatosPorPredio($predio){
        
        $objPreDep = new PredioDepartamentoController();
        
        $listPreDep = $objPreDep->selecionarPorPredio($predio);
        
        foreach($listPreDep as $preDep){
            
            
        }
    }
    
    function qtdOcorrencias($andamento){
        $oco = new OcorrenciaDAO();
        
        return $oco->qtdOcorrencia($andamento);
    }
    
    
    function listarOcorrenciasPorFuncionario($urgencia, $funcionario,$andamento) {
        $oco = new OcorrenciaDao();

        return $oco->findOcorrenciaByFuncionario($urgencia, $funcionario,$andamento);
    }

    /**
     * 
     * @param type $id
     * @param type $andamento
     * @param type $date
     * @return int se retornar -1 quer dizer que OS não possui equipe
     */
    function modificaAndamento($id, $andamento) {
        $oco = new OcorrenciaDao();
        return $oco->updateAndamento($id, $andamento);
    }
    
    function removeOcorrencia($id) {
        $oco = new OcorrenciaDao();
        return $oco->delete($id);
    }

    function iniciarSolucao($id, $andamento) {
        $oco = new OcorrenciaDao();
        return $oco->updateAndamentoInicio($id, $andamento, date('Y-m-d H:i:s'));
    }

    function montarEquipeSimples($id, $equipe, $andamento) {
        $oco = new OcorrenciaDao();
        $objEqui = new EquipeController();
        $ok = true;

        $objOcorrencia = new OcorrenciaController();
        $objOcorrencia->verificaEquipe($equipe);

        foreach ($equipe as $eq) {

            if (!$objEqui->montarEquipeSimples($eq, $id)) {
                $ok = false;
            }
        }
        if ($ok) {
            return $oco->updateAndamento($id, $andamento);
        }

        return false;
    }

    function montarEquipeVarios($id, $equipe, $andamento) {
        $oco = new OcorrenciaDao();
        $objEqui = new EquipeController();
        $objOcorrencia = new OcorrenciaController();

        $objOcorrencia->verificaEquipe($equipe);
        $ok = true;
        foreach ($id as $i) {
            foreach ($equipe as $eq) {
                if (!$objEqui->montarEquipeVarios($eq, $i)) {
                    $ok = false;
                }
            }
            $oco->updateAndamento($i, $andamento);
            
        }

        return $ok;
    }

    private function verificaEquipe($equipe) {//verificar se o funcionario nao esta cadastrado em nenhuma outra OS
        $objEqui = new EquipeController();

        foreach ($equipe as $eq) {
            $oco = $objEqui->possueEquipe($eq);
            if ($oco != -1) {//se funcionario possuir equipe, remove da equipe anterior
                $objEqui->removeFuncionarioDaEquipe($oco, $eq);
            }
        }
    }

    function resolverPeloUsuario($id, $usuario, $andamento, $date) {
        $oco = new OcorrenciaDao();
        $objEqui = new EquipeController();
        if ($objEqui->montarEquipeUsuario($usuario, $id)) {
            return $oco->updateAndamentoInicio($id, $andamento, $date);
        }
        return false;
    }

    function finalizaOS($id, $andamento) {
        $oco = new OcorrenciaDao();
        $objEquipe = new EquipeController();
        if ($objEquipe->finalizaOS($id)) {
            return $oco->updateAndamentoFim($id, $andamento, date('Y-m-d H:i:s'));
        }
        return false;
    }

    function equipeSelecionada($ocorrencia) {
        $oco = new OcorrenciaDao();

        return $oco->findEquipe($ocorrencia);
    }

    function filtrarOS($andamento, $categoria = "", $tipo = "", $urgencia = "", $campus = "") {
        $query = "select * from ocorrencia, tipo_ocorrencia, urgencia, especialidade, 
                campus, logradouro, andamento 
		where                                    
		ocorrencia.TIP_OCO_ID = tipo_ocorrencia.TIP_OCO_ID
		AND tipo_ocorrencia.URG_ID = urgencia.URG_ID
		AND tipo_ocorrencia.ESP_ID = especialidade.ESP_ID
		AND ocorrencia.CAM_ID = campus.CAM_ID
		AND logradouro.LOG_ID = campus.LOG_ID
		AND andamento.AND_ID = ocorrencia.AND_ID
                AND andamento.AND_ID = ?";
        $pesquisas = array();
        $pesquisas[] = $andamento;
        if (!empty($categoria)) {
            $query .= " AND especialidade.ESP_ID = ?";
            $pesquisas[] = $categoria;
        }
        if (!empty($tipo)) {
            $query .= " AND tipo_ocorrencia.TIP_OCO_ID = ?";
            $pesquisas[] = $tipo;
        }
        if (!empty($urgencia)) {
            $query .= " AND ocorrencia.URG_ID = ?";
            $pesquisas[] = $urgencia;
        }
        if (!empty($campus)) {
            $query .= " AND campus.CAM_ID = ?";
            $pesquisas[] = $campus;
        }
        $query .= " ;";
//        var_dump($query);
        $oco = new OcorrenciaDAO();
        return $oco->filter($query, $pesquisas);
    }

}
